Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - [C#]Struttura per utilizzo di numeri binari
Forum - C# / VB.NET - [C#]Struttura per utilizzo di numeri binari

Avatar
tuttodiMC (Normal User)
Expert


Messaggi: 327
Iscritto: 29/10/2012

Segnala al moderatore
Postato alle 20:33
Lunedì, 28/10/2013
Salve a tutti. Come da titolo ho creato una struttura in c# per lavorare più facilmente con i numeri binari. Ho ancora qualche dubbio perché è il primo tipo di valore che creo. Mettiamo che io creo una variabile di tipo bin, ovvero del tipo binario creato da me:

Codice sorgente - presumibilmente C# / VB.NET

  1. ...
  2. bin numeroBinario = new bin(34);
  3. ...



e poi voglio utilizzare il suo valore per una somma (ho eseguito l'overload dell'addizione):

Codice sorgente - presumibilmente Plain Text

  1. ...
  2. bin nuovoNumero = numeroBinario + 3;
  3. ...



come fa la variabile numeroBinario a restituire il suo valore? Cosa intendo dire: mettiamo che io vada a sommare due interi. Io so che l'intero ha il valore nello stack e viene richiamato quando faccio l'addizione. Come faccio io a far richiamare il valore che ottengo dall'inizializzazione con il costruttore? Io ho creato una variabile risultato a cui si accede tramite la proprietà relativa, ma come faccio negli esempi precedenti a far restituire il numero che mi serve, sapendo che il costruttore non restituisce neanche void?

Di seguito c'è la struttura nella sua interezza:

Codice sorgente - presumibilmente C++

  1. namespace BinaryData {
  2.     struct bin
  3.     {
  4.         private static int risultato;
  5.         private static int originalNumber;
  6.         public int this [int index] //DICHIARO L'INDICIZZATORE PER MODIFICARE I SINGOLI BIT
  7.         {
  8.             get {
  9.                 int? ritorno = null;  // CREO LA VARIABILE CHE CONTERRà IL RISULTATO
  10.                 bool inutile = (risultato & (1 << index)) != 0; // VERIFICO CHE IL BIT SIA DIVERSO DA 0
  11.                 if (inutile == true)
  12.                     ritorno = 1;
  13.                 else               // SE IL BIT TORNA TRUE IL RISULTATO SARà 1 ALTRIMENTI SARà 0
  14.                     ritorno = 0;
  15.                 return ritorno;
  16.             }
  17.             set {
  18.                 if (value == 0)
  19.                     risultato &= ~(1 << index);
  20.                 else if (value == 1)
  21.                     risultato != (1 << index);
  22.             }
  23.         }
  24.  
  25.         public int OriginalNumber
  26.         {
  27.             get
  28.             {
  29.                 return this.originalNumber;
  30.             }
  31.         }
  32.  
  33.         public int Result
  34.         {
  35.             get
  36.             {
  37.                 return this.risultato;
  38.             }
  39.         }
  40.    
  41.         public bin(int numero) //COSTRUTTORE
  42.         {
  43.             originalNumber = numero;
  44.             int risultato = ConvertToBin(numero);
  45.         }
  46.  
  47.         public static bin operator +(bin lhs, bin rhs)
  48.         {
  49.             string lhsString = ConvertToBin(lhs.Result).ToString(), rhsString = ConvertToBin(rhs.Result).ToString();
  50.             string temp = "";
  51.                 if (lhsString.Length > rhsString.Length)
  52.             {
  53.                 int diff = lhsString.Length - rhsString.Length;
  54.                 int minore = "rhs";
  55.             }
  56.             else if (rhsString.Length > lhsString.Length)
  57.             {
  58.                 int diff = rhsString.Length - lhsString.Length;
  59.                 string minore = "lhs";
  60.             }
  61.             for (; diff > 0; diff--)
  62.             {
  63.                 temp += "0";
  64.             }
  65.             switch (minore)
  66.             {
  67.                 case "rhs":
  68.                     temp += rhsString;
  69.                     rhsString = temp;
  70.                     break;
  71.                 case "lhs":
  72.                     temp += lhsString;
  73.                     lhsString = temp;
  74.                     break;
  75.             }
  76.             string a = b = c = "";
  77.             bool rip = false;
  78.             string result = "";
  79.             for (int i = minore.Length - 1; i >= 0; i--)
  80.             {
  81.                 string s1 = lhsString.Substring(i, 1), s2 = rhsString.Substring(i, 1);
  82.                 switch (s1 && s2)
  83.                 {
  84.                     case "0" && "0":
  85.                         if (rip == true)
  86.                             result += "1";
  87.                         else
  88.                             result += "0";
  89.                             rip = false;
  90.                             break;
  91.                     case ("0" && "1") || ("1" && "0"):
  92.                         result += 0;
  93.                         if (rip == true)
  94.                         {
  95.                             result += "0";
  96.                             rip = true;
  97.                         }
  98.                         else
  99.                         {
  100.                             result += "1";
  101.                             rip = false;
  102.                         }
  103.                         break;
  104.                     case "1" && "1":
  105.                         if (rip == true)
  106.                             result += "1";
  107.                         else
  108.                             result += "0";
  109.                         rip = true;
  110.                         break;
  111.                 }                    
  112.             }
  113.         }
  114.  
  115.         public static bin operator +(bin lhs, int rhs)
  116.         {
  117.             bin newbin = new bin(rhs);
  118.             return lhs + newbin;
  119.         }
  120.  
  121.         public static bin operator +(int lhs, bin rhs)
  122.         {
  123.             bin newbin = new bin(lhs);
  124.             return newbin + rhs;
  125.         }
  126.  
  127.         public static bin Invert(bin op) {
  128.             bin uno = new bin(1);
  129.             return ~(op.Result) + uno;
  130.         }
  131.     }
  132.    
  133. }




Spero di essere stato chiaro. Grazie in anticipo delle risposte.

PM Quote
Avatar
Poggi Marco (Member)
Guru


Messaggi: 969
Iscritto: 05/01/2010

Segnala al moderatore
Postato alle 22:05
Lunedì, 28/10/2013
All' interno dell' operatore +, costruisci una nuova istanza di bin. Quest' ultima sarà il risultato dell' operazione.
Il costruttore non restituisce niente, ma viene chiamato appunto per inizializzare la classe.
( http://msdn.microsoft.com/it-it/library/aa288467%28v=vs.71 ... )

Non ho capito alcune cose sull' impostazione della struttura.
Dove memorizzi il numero binario ?
Con che criterio esegui la somma tra due bin?



Ultima modifica effettuata da Poggi Marco il 28/10/2013 alle 22:21
PM Quote
Avatar
tuttodiMC (Normal User)
Expert


Messaggi: 327
Iscritto: 29/10/2012

Segnala al moderatore
Postato alle 19:50
Martedì, 29/10/2013
Il numero binario lo memorizzo dentro la variabile result a cui si accede tramite la proprietà Result. È proprio qui che volevo arrivare. Se io memorizzo il numero binario in una variabile, dopo, quando vado a fare un'assegnazione come questa

Codice sorgente - presumibilmente C# / VB.NET

  1. bin numeroBin = new bin(3);
  2. bin nuovoNumero = numerobin;



la variabile nuovoNumero conterrà realmente il valore di numeroBin?

PM Quote
Avatar
Poggi Marco (Member)
Guru


Messaggi: 969
Iscritto: 05/01/2010

Segnala al moderatore
Postato alle 21:19
Martedì, 29/10/2013
Tu stai lavorando con le struct, quindi l' operatore = funziona per valore; in effetti in nuovoNumero è memorizzata una copia di numeroBin.
Però nellla struct dichiari risultato e originalNumber come static. In questo modo i dati contenuti in ogni istanza di bin sono messi in comune.

PM Quote
Avatar
tuttodiMC (Normal User)
Expert


Messaggi: 327
Iscritto: 29/10/2012

Segnala al moderatore
Postato alle 20:47
Giovedì, 31/10/2013
Ma quindi tu intendi dire che per esempio originalNumber di nuovoNumero assumerà lo stesso valore della variabile omonima di numeroBin? E poi se io volessi stampare una variabile di tipo bin con Console.WriteLine(), cosa dovrei fare

PM Quote
Avatar
Poggi Marco (Member)
Guru


Messaggi: 969
Iscritto: 05/01/2010

Segnala al moderatore
Postato alle 21:15
Giovedì, 31/10/2013
Certamente, si. I dati dichiarati static sono messi in comune a titte le istanze della classe.
Per stampare i dati, ti serve una stringa. A tale scopo puoi creare un metodo apposta, o sovrascrivere il metodo ToString().  ( http://msdn.microsoft.com/it-it/library/ms173154%28v=vs.90 ...

PM Quote
Avatar
tuttodiMC (Normal User)
Expert


Messaggi: 327
Iscritto: 29/10/2012

Segnala al moderatore
Postato alle 15:16
Venerdì, 01/11/2013
Perfetto, grazie.

PM Quote